package main

import (
	"context"
	"fmt"
	"github.com/google/uuid"
	"time"
)

type ChainData struct {
	traceId   string //链路跟踪ID
	userId    int64  //用户ID
	sessionId string //会话ID
}

func (chainData ChainData) GetTraceId() string {
	return chainData.traceId
}

func (chainData ChainData) GetUserId() int64 {
	return chainData.userId
}

func (chainData ChainData) GetSessionId() string {
	return chainData.sessionId
}

var key = "key"

func main6() {
	// 生成UUID
	newUUID, _ := uuid.NewUUID()

	// 将traceId、userId和sessionId封装到ChainData结构体中
	data := ChainData{
		traceId:   newUUID.String(),
		userId:    1,
		sessionId: "s_202319876622",
	}

	// 将结构体对象用来创建valueCtx
	valCtx := context.WithValue(context.Background(), key, data)

	// 将valueCtx对象传入函数，并在子协程中执行
	go goPrint(valCtx)

	time.Sleep(1 * time.Second)
}

// 从上下文中获得多个属性值
func goPrint(valCtx context.Context) {
	value := valCtx.Value(key)
	data := value.(ChainData)
	fmt.Printf("跟踪ID ： %s\n", data.GetTraceId())
	fmt.Printf("用户ID ： %d\n", data.GetUserId())
	fmt.Printf("会话ID ： %s\n", data.GetSessionId())
}
